package net.uhuijia.goods.goodskuproperty.service.impl;

import net.uhuijia.constants.DBConst;
import net.uhuijia.enums.ErrorCodeEnum;
import net.uhuijia.exception.BusinessException;
import net.uhuijia.goods.skupropertyname.persistence.model.SkuPropertyName;
import net.uhuijia.goods.skupropertyname.service.SkuPropertyNameService;
import net.uhuijia.goods.skupropertyvalue.persistence.model.SkuPropertyValue;
import net.uhuijia.goods.skupropertyvalue.service.SkuPropertyValueService;
import net.uhuijia.vo.good.GoodSkuValueVo;
import net.uhuijia.vo.good.GoodSkuVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import net.uhuijia.appbase.service.CrudService;
import net.uhuijia.goods.goodskuproperty.persistence.dao.GoodSkuPropertyDao;
import net.uhuijia.goods.goodskuproperty.persistence.model.GoodSkuProperty;
import net.uhuijia.goods.goodskuproperty.persistence.model.GoodSkuPropertyExample;
import net.uhuijia.goods.goodskuproperty.persistence.model.GoodSkuPropertyExample.Criteria;
import net.uhuijia.goods.goodskuproperty.service.GoodSkuPropertyService;

import java.util.ArrayList;
import java.util.List;


@Service
@Transactional
public class GoodSkuPropertyServiceImpl
     extends CrudService<GoodSkuPropertyDao,GoodSkuProperty,GoodSkuPropertyExample>
     implements  GoodSkuPropertyService {
	@Autowired
	private GoodSkuPropertyDao goodSkuPropertyDao;
	
	@Autowired
	private GoodSkuPropertyService goodSkuPropertyService;

	@Autowired
	private SkuPropertyNameService skuPropertyNameService;

	@Autowired
	private SkuPropertyValueService skuPropertyValueService;

	@Override
	public GoodSkuProperty addGoodSkuProperty(String goodSkuId, String proNameId, String proValueId, String goodId) {
		GoodSkuProperty goodSkuProperty = new GoodSkuProperty();
		this.initDefalutFields(goodSkuProperty);
		goodSkuProperty.setGoodSkuId(goodSkuId);
		goodSkuProperty.setProNameId(proNameId);
		goodSkuProperty.setProValueId(proValueId);
		goodSkuPropertyService.add(goodSkuProperty);
		return goodSkuProperty;
	}

	/**
	 * 根据商品spuId 查询商品属性名称
	 * @author 许忠健
	 * @param spuId 商品spuId
	 * @return
	 */
	@Override
	public List<GoodSkuProperty> findGoodSkuPropertyNameBySpuId(String spuId) {
		List<GoodSkuProperty> goodSkuProperties = this.goodSkuPropertyDao.findGoodSkuPropertyNameBySpuId(spuId);
		return goodSkuProperties;
	}

	/**
	 * 根据商品Id 和属性名称ID 查询商品属性值
	 * @param spuId 商品SpuId
	 * @param propertyNameId 商品属性名称Id
	 * @return
	 */
	@Override
	public List<GoodSkuProperty> findGoodSkuPropertyValueBySpuIdAndProNameId(String spuId, String propertyNameId) {
		GoodSkuPropertyExample example = new GoodSkuPropertyExample();
		Criteria criteria = example.createCriteria();
		criteria.andGoodIdEqualTo(spuId);
		criteria.andProNameIdEqualTo(propertyNameId);
		criteria.andIsEffectiveEqualTo(DBConst.TRUE);
		List<GoodSkuProperty> goodSkuProperties = this.list(example);
		return goodSkuProperties;
	}
	/**
	 * @Author xzj
	 * @Description //根据商品获取商品sku属性集合
	 * @Date  2018/10/6
	 * @Param
	 * @return
	 **/
	@Override
	public List<GoodSkuVo> getGoodSkuVoBySpuId(String spuId) {
		if(StringUtils.isEmpty(spuId))
			throw new IllegalArgumentException();
		List<GoodSkuVo> goodSkuVos = new ArrayList<>();
		//根据商品Id获取商品属性名称
		List<GoodSkuProperty> goodSkuProperties = this.findGoodSkuPropertyNameBySpuId(spuId);
		if(!goodSkuProperties.isEmpty()){
			for(GoodSkuProperty goodSkuProperty : goodSkuProperties){
				GoodSkuVo goodSkuVo = new GoodSkuVo();
				//TODO 忘记匹配的是哪个ID 对接时候对下
				goodSkuVo.setGoodSkuId(goodSkuProperty.getId());
				SkuPropertyName skuPropertyName = this.skuPropertyNameService.get(goodSkuProperty.getProNameId());
				if(skuPropertyName!=null){
					goodSkuVo.setName(skuPropertyName.getName());
					//获取属性值集合
					List<GoodSkuProperty> goodSkuValueProperties = this.goodSkuPropertyService.findGoodSkuPropertyValueBySpuIdAndProNameId(spuId,goodSkuProperty.getProNameId());
					List<GoodSkuValueVo> goodSkuValueVos = new ArrayList<>();
					//遍历商品属性值 并添加到goodSkuValueVos 赋值给 goodSkuVo
					for(GoodSkuProperty goodSkuValueProperty :goodSkuValueProperties){
						SkuPropertyValue skuPropertyValue = this.skuPropertyValueService.get(goodSkuValueProperty.getProValueId());
						GoodSkuValueVo goodSkuValueVo = new GoodSkuValueVo(skuPropertyValue.getId(),skuPropertyValue.getPropertyValue());
						goodSkuValueVos.add(goodSkuValueVo);
					}
					goodSkuVo.setGoodSkuValueVos(goodSkuValueVos);
				}else{
					throw  new BusinessException(ErrorCodeEnum.sku_property_name_is_not_exist);
				}
				goodSkuVos.add(goodSkuVo);
			}
		}else{
			throw  new BusinessException(ErrorCodeEnum.good_not_have_sku_name_error);
		}
		return goodSkuVos;
	}
}